package com.coscon.shiro;

import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.authz.AuthorizationFilter;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/*
 * 
	roles参数可以写多个，多个时必须加上引号，并且参数之间用逗号分割，当有多个参数时，每个参数通过才算通过，相当于hasAllRoles()方法。shiro的角色过滤是and的关系。
	而最近根据项目需求，要求订阅号管理模块，多个角色都可以进行管理，角色的过滤非and关系而是or的关系，applicationContext.xml中roles[“管理员”，”订阅号”]不能实现或者关系的角色过滤，需要自定义继承AuthorizationFilter的Filter。
* @ClassName: CustomRolesAuthorizationFilter 
* @author 409390047@qq.com 
* @date 2021年06月16日 上午11:14:36
 */
@Slf4j
public class CustomRolesAuthorizationFilter extends AuthorizationFilter
{
	
	
	 @Override
	 protected boolean isAccessAllowed(ServletRequest request,
	   ServletResponse response, Object mappedValue) throws Exception
	 {
	  Subject subject = getSubject(request, response);  
	        String[] rolesArray = (String[]) mappedValue;  
	
	        if (rolesArray == null || rolesArray.length == 0) 
	        {  
	            return true;  
	        }  
	        for(int i=0;i<rolesArray.length;i++)
	        {
	            if(subject.hasRole(rolesArray[i]))
	            {  
	                return true;  
	            }  
	        }  
	        return false;  
	 }
	 
	 
}
